<?xml version="1.0" encoding="UTF-8"?>
<html lang="ja">

<head>
<link rev="MADE" href="mailto:vavivavi@yahoo.co.jp" />
<link rel="INDEX" href="orverview.html" />
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<meta http-equiv="Content-Style-Type" content="text/css" />
<link rel="stylesheet" type="text/css" href="../../../vavi.css" />
<title>vavi.sound</title>
<!--
 * Copyright (c) 2002 by Naohide Sano, All rights reserved.
 *
 * Written by Naohide Sano
 *
 * @author	<a href="mailto:vavivavi@yahoo.co.jp">Naohide Sano</a> (nsano)
 *
 * @version	0.00	020626	nsano	initial version
-->
</head>

<body>

このドキュメントは着メロライブラリの API 仕様です。

<h2>特徴</h2>
<ul>
<li>{@link javax.sound.midi.spi} として実装されているため特にプログラムで
意識することなく MFi ファイルを midi ファイルとして取り扱い可能です。</li>
<li>MFi バージョン 3.1 までの形式をサポートしています。</li>
<li>MFi ←→ SMF の相互変換が可能です。</li>
<li>機種依存データのハンドラを追加する事で各機種に対応した着声が作成可能です。</li>
</ul>

<h2>概要</h2>

<p>三つの大きなパートから構成されます。</p>
<ol>
    <li>ADPCM コーデック</li>
    <li>MFi ライブラリ</li>
    <li>{@link javax.sound.midi.spi} 実装</li>
</ol>

<h3>1. ADPCM コーデック</h3>

<p>パッケージ
<ul>
    <li>{@link vavi.sound.adpcm.ccitt}</li>
    <li>{@link vavi.sound.adpcm.ma}</li>
    <li>{@link vavi.sound.adpcm.vox}</li>
</ul>
</p>

<p>
着声に使用される ADPCM コーデックを取り扱うパッケージ群です。
Java の標準 IO ({@link java.io.InputStream}/{@link java.io.OutputStream}) として実装されているため
取り扱いが容易でストリーミングも楽に行えます。
</p>

<h3>2. MFi ライブラリ</h3>

<p>パッケージ
<ul>
    <li>{@link vavi.sound.mfi}</li>
    <li>{@link vavi.sound.mfi.vavi}</li>
    <li>:</li>
</ul>
</p>

<p>
着メロライブラリの核となる部分です。MFi のファイル構造を取り扱い、MIDI 構造に変換する事が出来ます。
また MIDI から MFi への変換も可能です。基本的に {@link javax.sound.midi} パッケージと同じ構造をとっています。
機種依存データを扱うパッケージとして {@link vavi.sound.mfi.vavi.mitsubishi D社} と
{@link vavi.sound.mfi.vavi.nec N社} がサンプル実装されています。
</p>


<h3>3. {@link javax.sound.midi.spi} 実装</h3>

<p>パッケージ
<ul>
    <li>{@link vavi.sound.midi}</li>
    <li>{@link vavi.sound.midi.mfi}</li>
</ul>
</p>

<p>
{@link javax.sound.midi.spi} の一実装として機能させるためのパッケージです。
<a href="http://java.sun.com/j2se/1.5.0/ja/docs/ja/guide/sound/programmer_guide/chapter1.html#111901">SPI</a>
仕様に従い登録すれば midi の一ファイル形式として MFi ファイルを
再生する事が可能になります。
</p>

<h2>使用方法</h2>

<h3>1. MFi から MIDI 作成</h3>
<pre>
        // 簡単すぎるか？
        File inFile = new File("sample.mld");
        vavi.sound.mfi.Sequence mfiSequence = MfiSystem.getSequence(inFile);
        Sequence midiSequence = MfiSystem.toMidiSequence(mfiSequence);

        File outFile = new File("sample.mid");
        MidiSystem.write(midiSequence, 0, outFile);
</pre>

<h3>2. MIDI から MFi 作成</h3>
<pre>
        // 簡単すぎるか？
        File inFile = new File("sample.mid");
        javax.sound.midi.Sequence midiSequence = MidiSystem.getSequence(inFile);
        MidiFileFormat midiFileFormat = MidiSystem.getMidiFileFormat(inFile);
        int type = midiFileFormat.getType();
        vavi.sound.mfi.Sequence mfiSequence = MfiSystem.toMfiSequence(midiSequence, type);

        File outFile = new File("sample.mld");
        MfiSystem.write(mfiSequence, VaviMfiFileFormat.FILE_TYPE, outFile);
</pre>

<h3>3. 着声作成</h3>
<pre>
        // ちょっとは敷居高くなったかな？
        int time = ...;
        InputStream waveStream = ...;

        Sequence sequence = new Sequence();
        Track track = sequence.createTrack();
        MfiMessage message;

        message = new CuePointMessage(0x00, 0x00);
        track.add(new MfiEvent(message, 0l));

        double aDelta = (60d / 120d) / 120d * 1000;
        int delta = (int) Math.round(time / aDelta);

        message = new TempoMessage(0x00, 0xcb, 0x78);
        track.add(new MfiEvent(message, 0l));

        MitsubishiMessage mdmessage = new MitsubishiMessage();
        mdmessage.toVolume(0x3f);
        track.add(new MfiEvent(mdmessage, 0l));

        mdmessage = new MitsubishiMessage();
        mdmessage.toPan(0x20);
        track.add(new MfiEvent(mdmessage, 0l));

        mdmessage = new MitsubishiMessage();
        mdmessage.toVoice(waveStream, 8000, 4, false);
        track.add(new MfiEvent(mdmessage, 0l));

        for (int i = 0; i &lt; delta / 256; i++) {
            message = new NopMessage(0xff, 0);
            track.add(new MfiEvent(message, 0l));
        }
        message = new NopMessage(delta % 256, 0);
        track.add(new MfiEvent(message, 0l));

        message = new EndOfTrackMessage(0, 0);
        track.add(new MfiEvent(message, 0l));

        MfiSystem.write(sequence, VaviMfiFileFormat.FILE_TYPE, new File("output.mld"));
</pre>

</body>

</html>
